package com.eian.boot.common.id.formatter;

import com.eian.boot.common.id.model.PadPosition;

import java.util.Objects;

/**
 * ID格式化工具
 *
 * @author alex.meng
 */
public class IdFormatter {

    /**
     * 默认补位字符
     */
    private static final char DEFAULT_PAD_CHAR = '0';

    /**
     * 默认补位位置
     */
    private static final PadPosition DEFAULT_PAD_POSITION = PadPosition.LEFT;

    /**
     * 格式化ID（完整参数）
     *
     * @param rawId       原始ID
     * @param prefix      前缀
     * @param suffix      后缀
     * @param padChar     补位字符
     * @param length      总长度（不包括前后缀）
     * @param padPosition 补位位置
     * @return 格式化后的ID
     */
    public String formatId(Object rawId, String prefix, String suffix, char padChar, int length, PadPosition padPosition) {
        Objects.requireNonNull(rawId, "原始ID不能为null");
        String id = String.valueOf(rawId);

        String paddedId;
        if (id.length() >= length || length <= 0) {
            paddedId = id;
        } else {
            String repeatVal = String.valueOf(padChar).repeat(length - id.length());
            if (padPosition == PadPosition.LEFT) {
                paddedId = repeatVal + id;
            } else {
                paddedId = id + repeatVal;
            }
        }
        return (prefix != null ? prefix : "") + paddedId + (suffix != null ? suffix : "");
    }

    /**
     * 格式化ID（使用默认补位字符和位置）
     *
     * @param rawId  原始ID
     * @param prefix 前缀
     * @param suffix 后缀
     * @param length 总长度
     * @return 格式化后的ID
     */
    public String formatId(Object rawId, String prefix, String suffix, int length) {
        return formatId(rawId, prefix, suffix, DEFAULT_PAD_CHAR, length, DEFAULT_PAD_POSITION);
    }

    /**
     * 格式化ID（使用默认补位字符和位置，无后缀）
     *
     * @param rawId  原始ID
     * @param prefix 前缀
     * @param length 总长度
     * @return 格式化后的ID
     */
    public String formatId(Object rawId, String prefix, int length) {
        return formatId(rawId, prefix, null, DEFAULT_PAD_CHAR, length, DEFAULT_PAD_POSITION);
    }

    /**
     * 格式化ID（仅前缀，不补位）
     *
     * @param rawId  原始ID
     * @param prefix 前缀
     * @return 格式化后的ID
     */
    public String formatId(Object rawId, String prefix) {
        return formatId(rawId, prefix, null, DEFAULT_PAD_CHAR, 0, DEFAULT_PAD_POSITION);
    }

    /**
     * 格式化ID（仅补位，无前后缀）
     *
     * @param rawId  原始ID
     * @param length 总长度
     * @return 格式化后的ID
     */
    public String formatId(Object rawId, int length) {
        return formatId(rawId, null, null, DEFAULT_PAD_CHAR, length, DEFAULT_PAD_POSITION);
    }

    /**
     * 格式化ID（不做任何处理，仅转字符串）
     *
     * @param rawId 原始ID
     * @return 格式化后的ID
     */
    public String formatId(Object rawId) {
        return formatId(rawId, null, null, DEFAULT_PAD_CHAR, 0, DEFAULT_PAD_POSITION);
    }
}

